package cn.px.rest.controller.upms;

import cn.px.common.bean.AbstractPageResultBean;
import cn.px.common.cache.ConfigCache;
import cn.px.common.enums.ResultCode;
import cn.px.common.util.R;
import cn.px.common.validation.group.AddGroup;
import cn.px.common.validation.group.UpdateGroup;
import cn.px.dao.dto.upms.SysConfigDTO;
import cn.px.dao.entity.upms.SysConfig;
import cn.px.rest.log.annotation.SysLog;
import cn.px.service.upms.SysConfigService;
import lombok.AllArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * @Description 系统参数配置 控制器
 * @author 品讯科技
 * @date 2024-08
 * @Version Copyright (c) 2019,北京乾元坤和科技有限公司 All rights reserved.
 */
@RestController
@AllArgsConstructor
@RequestMapping("/upms/configs")
public class SysConfigController {

  private final SysConfigService sysConfigService;

  /**
   * 通过id查询单条记录
   *
   * @param id 主键
   * @return R
   */
  @GetMapping("/{id}")
  public R<SysConfig> getById(@PathVariable("id") String id){
      return new R<>(sysConfigService.getModelById(id));
  }

  /**
   * 新增记录
   *
   * @param sysConfigDTO 系统参数配置DTO
   * @return R
   */
  @SysLog("新增系统参数配置")
  @PostMapping
  @PreAuthorize("@pms.hasPermission('upms-configs-add')")
  public R save(@Validated({AddGroup.class}) @RequestBody SysConfigDTO sysConfigDTO) {
      return new R<>(sysConfigService.saveModelByDTO(sysConfigDTO));
  }

  /**
   * 修改记录
   *
   * @param sysConfigDTO 系统参数配置DTO
   * @return R
   */
  @SysLog("修改系统参数配置")
  @PutMapping("/{id}")
  @PreAuthorize("@pms.hasPermission('upms-configs-edit')")
  public R update(@PathVariable("id") String id, @Validated({UpdateGroup.class}) @RequestBody SysConfigDTO sysConfigDTO) {
      sysConfigService.modModelByDTO(sysConfigDTO);
      return new R<>();
  }

    /**
     * 批量修改记录
     *
     * @param sysConfigDTOList 系统参数配置DTO列表
     * @return R
     */
    @SysLog("修改系统参数配置")
    @PutMapping("/update/batch")
    @PreAuthorize("@pms.hasPermission('upms-configs-edit')")
    public R updateBatch(@Validated({UpdateGroup.class}) @RequestBody List<SysConfigDTO> sysConfigDTOList) {
        sysConfigService.modModelListByDTO(sysConfigDTOList);
        return new R<>();
    }

  /**
   * 通过id删除一条记录
   *
   * @param id 主键
   * @return R
   */
  @SysLog("删除系统参数配置")
  @DeleteMapping("/{id}")
  @PreAuthorize("@pms.hasPermission('upms-configs-del')")
  public R removeById(@PathVariable String id){
    sysConfigService.deleteByPrimaryKey(id);
    return new R<>();
  }

    /**
     * 批量记录
     *
     * @param ids 主键
     * @return R
     */
    @SysLog("批量删除系统参数配置")
    @DeleteMapping("")
    @PreAuthorize("@pms.hasPermission('upms-configs-del')")
    public R removeIds(@RequestBody List<String> ids){
        sysConfigService.batchDelete(ids);
        return new R<>();
    }

  /**
   * 初始化
   *
   * @return R
   */
  @PostMapping("/init")
//    @PreAuthorize("@pms.hasPermission('upms-regions-init')")
  public R init() {
    sysConfigService.init();
    return R.success(ResultCode.SUCCESS);
  }

  /**
   * 获取分页
   *
   * @param pageNum 当前页码
   * @param pageSize 每页条数
   * @param sysConfigDTO 系统参数配置DTO
   * @return R
   */
  @GetMapping("/page")
  public R<AbstractPageResultBean<SysConfig>> query(SysConfigDTO sysConfigDTO, @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "20") int pageSize) {
      return new R<>(sysConfigService.selectPageInfo(sysConfigDTO, pageNum, pageSize));
  }

  /**
   * 获取列表
   *
   * @param sysConfigDTO 系统参数配置DTO
   * @return R
   */
  @GetMapping("")
  public R query(SysConfigDTO sysConfigDTO) {
      return new R<>(sysConfigService.getModelListByDTO(sysConfigDTO));
  }

    /**
     * 获取供前端使用
     *
     * @return R
     */
    @GetMapping("/data")
    public R<Map<String, Object>> queryForFront() {
        return new R<>(sysConfigService.getUsedByFront());
    }

  @GetMapping("/logo")
  public R getLogo() {
    String logo = ConfigCache.getLabelByValue("LOGO");

    return new R<>(logo);
  }
}
